import axios from "axios";
import router from "@/router";
// 非组件模块可以这样加载使用 element 的 message 提示组件
import { ElMessage } from "element-plus";
export const BaseUrl = "http://127.0.0.1:8000/"


// 跨域问题https://blog.csdn.net/qq_42196055/article/details/104918291
// https://blog.csdn.net/scarlett_one/article/details/108272588

const request = axios.create({
  baseURL: BaseUrl,
  transformResponse: [
    function (data) {
      try {
        return JSON.parse(data);
      } catch (err) {
        return data;
      }
    },
  ],
});


request.interceptors.request.use(
  // 任何所有请求会经过这里
  // config 是当前请求相关的配置信息对象
  // config 是可以修改的
  function (config) {
    const token = window.localStorage.getItem("token");
    // 如果有登录用户信息，则统一设置 token
    if (token) {
      config.headers.Authorization = `${token}`;
    }
    return config;
  },
  // 请求失败，会经过这里
  function (error) {
    return Promise.reject(error);
  }
);

// 响应拦截器
// Add a response interceptor
request.interceptors.response.use(
  function (response) {
    const { status, data: { code, message } } = response;
    const err_code: number[] = [29, 30, 111, 31]
    if (err_code.includes(code)) {
      router.push("/login");
      ElMessage.error(message);
      return response;
    }
    // 所有响应码为 2xx 的响应都会进入这里
    if (status === 200) {
      return response;
    }
    if (status === 403) {
      router.push("/login");
      ElMessage.error("登录状态无效，请重新登录");
      return response;
    }
    if (status >= 500) {
      ElMessage.error("服务器内部异常");
      return response;
    }
    // response 是响应处理
    // 注意：一定要把响应结果 return，否则真正发请求的位置拿不到数据
    return response;
  },
  function (error) {
    const { status } = error.response;
    // 任何超出 2xx 的响应码都会进入这里
    if (status === 403) {
      router.push("/login");
      ElMessage.error("登录状态无效，请重新登录");
    } else if (status >= 500 || status == 405) {
      ElMessage.error("服务端内部异常，请稍后重试");
    }
    // return Promise.reject(error);
    return error.response
  }
);

export default request;

